当前位置:  开发笔记 > 编程语言 > 正文

为什么`Future#toString`返回`"List()"`?

如何解决《为什么`Future#toString`返回`"List()"`?》经验,为你挑选了1个好方法。

.toString在不等待复合的情况下呼唤未来会导致不确定的结果.我的问题是为什么在scala 2.10.x和2.11.x中调用.toString未完成的期货收益"List()"?该实现似乎并未明确.

可以从REPL中观察到此行为:

scala> import scala.concurrent.Future, scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global

scala> Future(1).toString
res0: scala.concurrent.Future[Int] = Success(1)

scala> Future(1).toString
res1: scala.concurrent.Future[Int] = List()

请注意,Scala 2.12.x可能会显式实现Future#toString返回"Future()"(源代码).


编辑:证明这不是来自REPL或"隐藏隐藏"的人工制品(-Yno-predef删除所有默认隐含):

Future.scala:

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object Main extends App {
  System.out.println(Future(1).toString)
}

build.sbt:

scalaVersion := "2.11.8"

scalacOptions := Seq(
  "-deprecation",
  "-encoding", "UTF-8",
  "-feature",
  "-unchecked",
  "-Yno-predef",
  "-Xfatal-warnings",
  "-Xlint",
  "-Yinline-warnings",
  "-Yno-adapted-args",
  "-Ywarn-dead-code",
  "-Ywarn-unused-import",
  "-Ywarn-numeric-widen",
  "-Ywarn-value-discard",
  "-Xfuture")

Viktor Klang.. 8

消除依赖性是一个不幸的副作用sun.misc.Unsafe.它在Scala 2.12和更新版本的Scala 2.11 IIRC中得到了纠正.



1> Viktor Klang..:

消除依赖性是一个不幸的副作用sun.misc.Unsafe.它在Scala 2.12和更新版本的Scala 2.11 IIRC中得到了纠正.


出于好奇,你能解释一下`sun.misc.Unsafe`与`"List()"这里有什么关系?
我们通过扩展AtomicReference来取而代之,AtomicReference令人遗憾地"overrode"toString.正在打印的列表是回调列表.
推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有